package org.eclipse.gittab.player;

import java.util.List;

/**
 * The {@link Composer} interface provides the ability to compose a song with a
 * guitar. It can be so easy ;).
 * 
 * @author mtreitle
 * 
 */
public interface Composer {

	public enum PickingMode {
		DOWN, UP
	}

	/**
	 * Produces a single note.
	 * 
	 * @param note
	 * @param noteValue
	 * @param velocity
	 * @param sound
	 */
	public void note(PlayableNote note, int noteValue, int velocity,
			int instrument);

	/**
	 * Produces a chord.
	 * 
	 * @param notes
	 * @param noteValue
	 * @param velocity
	 * @param sound
	 */
	public void chord(List<PlayableNote> notes, int noteValue, int velocity,
			int instrument);

	/**
	 * Produces several notes picked as a chord. </p> Automatically calculates
	 * the picking speed from the note value.
	 * 
	 * @param notes
	 * @param noteValue
	 * @param velocity
	 * @param mode
	 * @param sound
	 */
	public void chordPicked(List<PlayableNote> notes, int noteValue,
			int velocity, PickingMode mode, int instrument);

	/**
	 * Produces a pause note.
	 * 
	 * @param noteValue
	 */
	public void pause(int noteValue);

	/**
	 * Gets the composed tab that can be loaded into a {@link Player}.
	 * 
	 * @return
	 */
	public ComposedTab getComposedTab();

}
